package phonenumber

import (
	"errors"
	"fmt"
	"regexp"
	"strconv"
	"strings"
)

const testVersion = 2

func Number(input string) (actual string, actualErr error) {
	nanp := regexp.MustCompile(`[0-9]`)
	telephones := nanp.FindAllString(input, -1)

	if len(telephones) != 10 && len(telephones) != 11 {
		actualErr = errors.New("errors1")
		return
	}

	if len(telephones) == 10 {
		i0, _ := strconv.Atoi(telephones[0])
		i3, _ := strconv.Atoi(telephones[3])
		if i0 < 2 || i3 < 2 {
			actualErr = errors.New("errors2")
			return
		}

		actual = strings.Join(telephones, "")
	}

	if len(telephones) == 11 {
		i0, _ := strconv.Atoi(telephones[0])
		i1, _ := strconv.Atoi(telephones[1])
		i4, _ := strconv.Atoi(telephones[4])
		if i0 != 1 || i1 < 2 || i4 < 2 {
			actualErr = errors.New("errors3")
			return
		}

		actual = strings.Join(telephones[1:], "")
	}

	return
}

func AreaCode(input string) (string, error) {
	actual, actualErr := Number(input)
	if actualErr == nil {
		return actual[0:3], actualErr
	}

	return actual, actualErr
}

func Format(input string) (string, error) {
	actual, actualErr := Number(input)
	if actualErr == nil {
		return fmt.Sprintf(
				"(%v) %v-%v", actual[0:3],
				actual[3:6], actual[6:]),
			actualErr
	}

	return actual, actualErr
}
